﻿using System;
using System.Collections.Generic;
using System.Text;

namespace SilverlightCairngorm.Control
{
    /// <summary>
    /// Used to dispatch system events, by raising an event that the 
    /// controller class subscribes to every time any system event is 
    /// raised.
	/// Client code has no need to use this class. (internal class)
    /// </summary>
    internal class CairngormEventDispatcher
    {
		private static readonly CairngormEventDispatcher _instance = new CairngormEventDispatcher();

		// Explicit static constructor to tell C# compiler
		// not to mark type as beforefieldinit
		static CairngormEventDispatcher()
		{
		}

		/// <summary>
		/// private constructor
		/// </summary>
		private CairngormEventDispatcher()
		{
		}

		/// <summary>
		/// Returns the single instance of the dispatcher
		/// </summary>
		/// <returns>single instance of the dispatcher</returns>
		public static CairngormEventDispatcher Instance { get { return _instance; } }

		/// <summary>
        /// The subscriber to a system event must accept as argument
        /// the CairngormEvent raised (within a CairngormEventArgs\
        /// object)
        /// </summary>
        /// <param name="sender">Unused</param>
		/// <param name="args">a CairngormEventArgs object, containing the raised event object</param>
        public delegate void EventDispatchDelegate(object sender, CairngormEventArgs args);
		/// <summary>
        /// The single event raised whenever a Cairngorm system event occurs
        /// </summary>
		public event EventDispatchDelegate EventDispatched = delegate { };

        /// <summary>
        /// dispatchEvent raises a normal .net event, containing the 
        /// instance of the CairngormEvent raised - to be handled by
        /// the Controller Class
        /// </summary>
        /// <param name="cairngormEvent">the raised Cairngorm Event</param>
        public void dispatchEvent(CairngormEvent cairngormEvent)
        {
			CairngormEventArgs args = new CairngormEventArgs(cairngormEvent);
			EventDispatched(null, args);
        }
    }
}
